package com.matouli.infra.redis;

import org.redisson.api.RBlockingQueue;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RCountDownLatch;
import org.redisson.api.RDelayedQueue;
import org.redisson.api.RLock;
import org.redisson.api.RPermitExpirableSemaphore;
import org.redisson.api.RQueue;
import org.redisson.api.RReadWriteLock;
import org.redisson.api.RSemaphore;

/**
 * Redis 服务
 */
public interface IRedisService {

    /**
     * 设置指定 key 的值
     */
    <T> void setValue(String kye, T value);

    /**
     * 设置指定 key 的值
     */
    <T> void setValue(String key, T value, long expired);

    <T> T getValue(String key);

    /**
     * 获取队列
     */
    <T> RQueue<T> getQueue(String key);

    /**
     * 加锁队列
     */
    <T> RBlockingQueue<T> getBlockingQueue(String key);

    /**
     * 延迟队列
     */
    <T> RDelayedQueue<T> getDelayedQueue(RBlockingQueue<T> queue);

    /**
     * 自增key的值 ： 1、2、3
     */
    long incr(String key);

    /**
     * 指定值，自增key的值 ： 1、2、3
     */
    long incrBy(String key, long delta);

    /**
     * 自减 key 的值
     */
    long decr(String key);

    /**
     * 自减 key 的值 指定值
     */
    long decrBy(String key, long delta);

    /**
     * 移除指定key的值
     */
    void remove(String key);

    /**
     * 判断指定key的值是否存在
     */
    boolean isExists(String key);

    /**
     * 将指定的值添加到集合中
     */
    void addToSet(String key, String value);

    /**
     * 判断指定的值是否是集合的成员
     */
    boolean isSetMember(String key, String value);

    /**
     * 将指定的值添加到列表中
     */
    void addToList(String key, String value);

    /**
     * 获取列表置顶索引的值
     */
    String getFromList(String key, int index);

    /**
     * 将指定的键值对添加到哈希表中
     */
    void addToMap(String key, String field, String value);

    /**
     * 获取哈希表中指定字段的值
     */
    String getFromMap(String key, String field);

    /**
     * 将指定的值添加到有序集合中
     */
    void addToSortedSet(String key, String value);

    /**
     * 获取 redis的锁（可重入锁）
     */
    RLock getLock(String key);

    /**
     * 获取 Redis 锁（公平锁）
     */
    RLock getFairLock(String key);

    /**
     * 获取 Redis 锁（读写锁）
     */
    RReadWriteLock getReadWriteLock(String key);

    /**
     * 获取redis信号量
     */
    RSemaphore getSemaphore(String key);

    /**
     * 获取 redis 过期信号量
     * 基于Redis的Redisson的分布式信号量（Semaphore）Java对象RSemaphore采用了与java.util.concurrent.Semaphore相似的接口和用法。
     * 同时还提供了异步（Async）、反射式（Reactive）和RxJava2标准的接口。
     */
    RPermitExpirableSemaphore getPermitExpirableSemaphore(String key);

    /**
     * 闭锁
     */
    RCountDownLatch getCountDownLatch(String key);

    /**
     * 布隆过滤器
     */
    <T> RBloomFilter<T> getBloomFilter(String key);
}
